6 REM   ******************************************

8 REM   *** (DFT4.2) GENERATE/ANALYZE WAVEFORM ***

10 REM  ******************************************

12 PI = 3.141592653589793#: P2 = 2 * PI: K1 = PI / 8: K2 = 1 / PI

14 DIM C(2, 16), S(2, 16), KC(2, 16), KS(2, 16)

16 CLS : FOR J = 0 TO 16: FOR I = 1 TO 2: C(I, J) = 0: S(I, J) = 0: NEXT: NEXT

19 REM     *******************

20 CLS : REM *    MAIN MENU    *

21 REM     *******************

22 PRINT : PRINT : PRINT "         MAIN MENU": PRINT

24 PRINT " 1 = GENERATE FUNCTION": PRINT

26 PRINT " 2 = TRANSFORM FUNCTION": PRINT

28 PRINT " 3 = INVERSE TRANSFORM": PRINT

30 PRINT " 4 = EXIT": PRINT : PRINT

32 PRINT SPC(10); "MAKE SELECTION";

34 A$ = INKEY$: IF A$ = "" THEN 34

36 A = VAL(A$): ON A GOSUB 300, 40, 80, 1000

38 GOTO 20

39 REM     *****************************

40 CLS : REM * FORWARD TRANSFORM ROUTINE *

41 REM     *****************************

42 CLS : N = 1: M = 2: K5 = 16: K6 = -1: GOSUB 108

44 FOR J = 0 TO 16: C(2, J) = 0: S(2, J) = 0: NEXT

45 GOSUB 200: REM - PERFORM DFT

46 GOSUB 140: REM - PRINT OUT FINAL VALUES

48 PRINT : INPUT "C/R TO CONTINUE"; A$

50 RETURN

79 REM ************************

80 REM *   INVERSE TRANSFORM  *

81 REM ************************

82 CLS : FOR I = 0 TO 15: C(1, I) = 0: S(1, I) = 0: NEXT

84 N = 2: M = 1: K5 = 1: K6 = 1: GOSUB 200: REM RECONSTRUCT INPUT

85 GOSUB 150: REM PRINT HEADING

86 GOSUB 140: REM PRINT OUTPUT

88 PRINT : INPUT "C/R TO CONTINUE"; A$

90 RETURN

100 REM  ******************************************

102 REM  *         PROGRAM SUBROUTINES            *

104 REM  ******************************************

106 REM  *       PRINT COLUMN HEADINGS            *

108 PRINT : PRINT

110 PRINT "FREQ    F(COS)      F(SIN)      Y(COS)      Y(SIN)"

112 PRINT

114 RETURN

137 REM ******************************

138 REM *       PRINT OUTPUT         *

139 REM ******************************

140 FOR Z = 0 TO 15

142 PRINT Z; "    ";

144 PRINT USING "##.#####_    "; C(M, Z); S(M, Z); KC(M, Z); KS(M, Z)

146 NEXT Z

148 RETURN

150 REM ******************************

152 REM *    PRINT COLUMN HEADINGS   *

154 PRINT : PRINT

156 PRINT " T        RECONSTRUCTION          INPUT FUNCTION"

158 PRINT

160 RETURN

200 REM *******************************

202 REM *     TRANSFORM/RECONSTRUCT   *

204 REM *******************************

206 FOR J = 0 TO 15: REM SOLVE EQNS FOR EACH FREQUENCY

208 FOR I = 0 TO 15: REM MULTIPLY AND SUM EACH POINT

210 C(M, J) = C(M, J) + C(N, I) * COS(J * I * K1) + K6 * S(N, I) * SIN(J * I * K1)

211 S(M, J) = S(M, J) - K6 * C(N, I) * SIN(J * I * K1) + S(N, I) * COS(J * I * K1)

212 NEXT I

214 C(M, J) = C(M, J) / K5: S(M, J) = S(M, J) / K5: REM SCALE RESULTS

216 NEXT J

218 RETURN

299 REM     **********************

300 CLS : REM *   FUNCTION MENU    *

301 REM     **********************

302 FOR I = 0 TO 15: C(1, I) = 0: S(1, I) = 0

303 FOR J = 1 TO 2: KC(J, I) = 0: KS(J, I) = 0: NEXT: NEXT

304 PRINT : PRINT : PRINT "         FUNCTION MENU": PRINT

306 PRINT " 1 = TRIANGLE WAVE": PRINT

308 PRINT " 2 = CIRCLE": PRINT

310 PRINT " 3 = ELLIPSE 1": PRINT

312 PRINT " 4 = ELLIPSE 2": PRINT

320 PRINT SPC(10); "MAKE SELECTION";

322 A$ = INKEY$: IF A$ = "" THEN 322

326 A = VAL(A$): ON A GOSUB 330, 340, 350, 360, 1000

328 RETURN

330 REM *** GENERATE FUNCTION F(X) ***

332 FOR I = 0 TO 15: K3 = I * K1

334 C(1, I) = COS(K3) + COS(3 * K3) / 9 + COS(5 * K3) / 25 + COS(7 * K3) / 49

335 KC(1, I) = C(1, I)

336 NEXT

338 FOR I = 1 TO 7 STEP 2: KC(2, I) = 1 / I ^ 2: NEXT

339 RETURN

340 REM *** GENERATE CIRCLE F(X) ***

342 FOR I = 0 TO 15: K3 = I * K1

344 C(1, I) = SIN(K3): S(1, I) = COS(K3)

345 KC(1, I) = C(1, I): KS(1, I) = S(1, I)

346 NEXT

348 KS(2, 15) = 1

349 RETURN

350 REM *** GENERATE ELLIPSE 1 ***

352 FOR I = 0 TO 15: K3 = I * K1

354 C(1, I) = SIN(K3): S(1, I) = 2 * COS(K3)

355 KC(1, I) = C(1, I): KS(1, I) = S(1, I)

356 NEXT

358 KS(2, 1) = 1.5: KS(2, 15) = .5

359 RETURN

360 REM *** GENERATE ELLIPSE 2 ***

362 FOR I = 0 TO 15: K3 = I * K1

364 C(1, I) = COS(K3): S(1, I) = 2 * SIN(K3)

365 KC(1, I) = C(1, I): KS(1, I) = S(1, I)

366 NEXT

368 KC(2, 1) = -.5: KC(2, 15) = 1.5

369 RETURN

1000 STOP



